package com.liang.bishi.mega;

/**
 * 将三个用字符串表示的数字求和，不能使用 BigInteger，数字超过 long 能表示的最大范围
 */
public class Test01 {
    public static void main(String[] args) {
        Test01 largeSum = new Test01();
        String num1 = "98765432109876543210";
        String num2 = "12345678901234567890";
        String num3 = "55555555555555555555";

        String result = largeSum.sumLargeNumbers(num1, num2, num3);
        System.out.println("Sum: " + result); // 输出大数字的和
    }

    public String sumLargeNumbers(String num1, String num2, String num3) {
        // 结果字符串
        StringBuilder result = new StringBuilder();
        // 反转字符串，方便从个位开始加
        num1 = new StringBuilder(num1).reverse().toString();
        num2 = new StringBuilder(num2).reverse().toString();
        num3 = new StringBuilder(num3).reverse().toString();

        int len1 = num1.length();
        int len2 = num2.length();
        int len3 = num3.length();

        int carry = 0; // 进位

        int maxLen = Math.max(Math.max(len1, len2), len3);

        // 从末尾开始逐位相加
        for (int i = 0; i < maxLen || carry != 0; i++) {
            // 获取每个数字的位置，如果超出长度则为 0
            int digit1 = (i < len1) ? num1.charAt(i) - '0' : 0;
            int digit2 = (i < len2) ? num2.charAt(i) - '0' : 0;
            int digit3 = (i < len3) ? num3.charAt(i) - '0' : 0;
            int sum = digit1 + digit2 + digit3 + carry;
            // 计算进位
            carry = sum / 10;
            // 将当前位结果加到 result 中
            result.append(sum % 10);
        }

        // 反转并返回最终的结果
        return result.reverse().toString();
    }

}
